layout.tsx 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. import Link from 'next/link';
  2. import type { ReactNode } from 'react';
  3. import { cookies } from 'next/headers';
  4. import { notFound } from 'next/navigation';
  5. import { loadAuthV2Workspace } from '../lib/load-workspace';
  6. import { AuthProjectNav } from './auth-project-nav';
  7. export const dynamic = 'force-dynamic';
  8. /**
  9. * Per-project Auth shell — same header + tabs pattern as Projects:
  10. * ← Auth
  11. * {name}
  12. * {slug} · Auth on|off
  13. * [tabs…] [↗ developer mode]
  14. */
  15. export default async function AuthProjectLayout({
  16. children,
  17. params,
  18. }: {
  19. children: ReactNode;
  20. params: Promise<{ projectId: string }>;
  21. }) {
  22. const { projectId } = await params;
  23. const developerMode =
  24. (await cookies()).get('briven_auth_project_dev')?.value === '1';
  25. const projects = await loadAuthV2Workspace();
  26. const project = projects.find(
  27. (p) => p.id === projectId || p.id.toLowerCase() === projectId.toLowerCase(),
  28. );
  29. if (!project) {
  30. notFound();
  31. }
  32. // Trust workspace flag; layout badge only (page may re-check enable).
  33. const authOn = project.authEnabled === true;
  34. return (
  35. <div className="flex flex-col gap-6">
  36. <header>
  37. <Link
  38. href="/dashboard/auth"
  39. className="font-mono text-xs text-[var(--color-text-subtle)] hover:text-[var(--color-text-muted)]"
  40. >
  41. ← Auth
  42. </Link>
  43. <h1 className="mt-2 font-mono text-xl tracking-tight text-[var(--color-text)]">
  44. {project.name}
  45. </h1>
  46. <p className="mt-1 font-mono text-sm text-[var(--color-text-muted)]">
  47. {project.slug}
  48. {' · '}
  49. {authOn ? (
  50. <span style={{ color: 'var(--auth-accent, #FFFD74)' }}>Auth on</span>
  51. ) : (
  52. <span>Auth off</span>
  53. )}
  54. </p>
  55. </header>
  56. <AuthProjectNav projectId={project.id} developerMode={developerMode} />
  57. <section>{children}</section>
  58. </div>
  59. );
  60. }